#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Kontrolcu-Tk
#  - Kontrolcu icin Tk arayüzü
#
# Geliştiriciler:
#  - Osman KARAGÖZ <osmank3@gmail.com>
#  - Taha Doğan Güneş <tdgunes@gmail.com>
# Belgelendirici:
#  - Okan Okuroğulları <ookurogullari@gmail.com>
#
# Web Sitesi: http://code.google.com/p/kontrolcu
# Lisansı: GPL v3 ile lisanslanmıştır.
#
# Yardım dökümanlarını http://code.google.com/p/kontrolcu/w/list 
#                                     adresinden bulabilirsiniz.

import sys, hashlib

try:
    import libkontrolcu
except:
    print "libkontrolcu modülü bulunamadı"
    exit()
        
try:
    from Tkinter import *
    from tkFileDialog import *
    from tkMessageBox import *
except:
    print "python-tk kurulu değil. Lütfen paket yöneticinizle kurun."
    exit()

class kontk():    
    def __init__(self):
        self.Pencere()
    
    def Pencere(self):
        self.ana=Tk()
        self.ana.title("Kontrolcu-tk")
    
        try:
            try:
                import ImageTk
                icon = ImageTk.PhotoImage(file="/usr/share/icons/kont-tk.png")
                self.ana.tk.call('wm', 'iconphoto', self.ana._w, icon)
            except:
                try:
                    import ImageTk
                    icon = ImageTk.PhotoImage(file="/usr/local/share/icons/kont-tk.png")
                    self.ana.tk.call('wm', 'iconphoto', self.ana._w, icon)
                except:
                    print "Uygulama simgesi bulunamadı"
                    pass
        except:
            print "ImageTk kurulu değil. Lütfen paket yöneticinizle kurun."
            pass
    
        self.dosliste=[]
    
        self.ana.maxsize("560", "250")
        self.ana.minsize("560", "250")
    
        geo=((self.ana.winfo_screenwidth()/2)-280,
             (self.ana.winfo_screenheight()/2)-115)
        self.ana.geometry("+%d+%d"% geo)
        
        self.altDurum()
        
        self.F=Frame()
        self.F0=Frame(self.F)
        self.FA=Frame(self.F0, relief=RAISED)
    
        self.FA1=Frame(self.FA, relief=RAISED, borderwidth=0)
        Label(self.FA1, text="Kontrol tipi").pack(anchor=N)
        degisken=StringVar()
        self.opt=OptionMenu(self.FA1, degisken, "md5", "sha1", "sha224", "sha256", "sha384", "sha512", command=self.KonTopSec)
        self.opt.pack(anchor=N, fill=BOTH, padx=6)
        self.FA1.pack(anchor=N, fill=BOTH)
    
        self.FA2=Frame(self.FA, relief=RAISED)
        K=Button(self.FA2, text="Kontrol et")
        K.config(command=self.KontrolEt)
        K.pack(pady=3, fill=BOTH)
        S=Button(self.FA2, text="Kaydet")
        S.config(command=self.Kaydet)
        S.pack(pady=3, fill=BOTH)
        T=Button(self.FA2, text="Temizle")
        T.config(command=self.Temizle)
        T.pack(pady=3, fill=BOTH)
        self.FA2.pack(side=BOTTOM, padx=8)

        self.FA.pack(side=LEFT, fill=Y, pady=8)
        
        self.FB=Frame(self.F0, relief=RAISED)
    
        self.FB1=Frame(self.FB, relief=RAISED)
        self.FB1A=Frame(self.FB1)
        self.E=Entry(self.FB1A, relief=RAISED, bg="#FFFFFF")
        self.E.pack(fill=X, anchor=NW, padx=4, pady=4)
        self.FB1A.pack(side=BOTTOM, fill=X)
    
        self.FB1B=Frame(self.FB1)
        D=Button(self.FB1B, text="Dosya Ekle", command=self.DosyaSec)
        D.pack(side=LEFT, pady=2, padx=20)
        EB=Button(self.FB1B, text="Düzenle / Ekle", command=self.DuzenleEkle)
        EB.pack(side=LEFT)
        CB=Button(self.FB1B, text="Dosya Çıkar", command=self.DosyaCikar)
        CB.pack(side=RIGHT, pady=2, padx=20)
        self.FB1B.pack(anchor=CENTER)
        self.FB1.pack(side=TOP, fill=X)
        
        self.FB2=Frame(self.FB, relief=RAISED)
        self.L=Listbox(self.FB2, width=55, height=8, bg="#FFFFFF")
        sbar=Scrollbar(self.FB, command=self.L.yview)
        self.L.config(yscrollcommand=sbar.set)
        self.L.pack()
        sbar.pack(side=RIGHT, fill=Y)
        self.FB2.pack(side=BOTTOM)
        
        self.FB.pack(side=RIGHT, padx=2, pady=2)
        
        self.F0.pack(side=TOP)
        
        self.Durum=Label(self.F, text="Durum: Hoşgeldiniz.")
        self.Durum.pack(side=LEFT, padx=8)
    
        self.F.pack(side=TOP)
    
        #Menüler
    
        top=Menu(self.ana)
        self.ana.config(menu=top)
        dosya=Menu(top)
        dosya.add_command(label="Yeni Kontrol", underline=0, command=self.Temizle)
        dosya.add_command(label="Kontrolu Kaydet", underline=9, command=self.Kaydet)
        dosya.add_separator()
        dosya.add_command(label="Dosyadan Kontrol", underline=0, command=self.KontrolDosyasi)
        dosya.add_command(label="Sağlama", underline=0, command=self.Saglama)
        dosya.add_separator()
        dosya.add_command(label="Çıkış", underline=0, command=exit)
        top.add_cascade(label="Dosya", underline=0, menu=dosya)
        
        yardimmenu=Menu(self.ana)
        yardimmenu.add_command(label="Yardım Başlıkları", underline=0, command=self.yardim)
        yardimmenu.add_command(label="Hakkında", underline=0, command=self.hakkinda)
        top.add_cascade(label="Yardım", underline=0, menu=yardimmenu)
        
        #Kısayollar
        
        self.ana.bind("<Control-s>", self.Kaydet)
        self.ana.bind("<Control-n>", self.Temizle)
        self.ana.bind("<Control-d>", self.DosyaSec)
        self.ana.bind("<Control-c>", self.KontrolEt)
        self.ana.bind("<Control-o>", self.KontrolDosyasi)
        self.ana.bind("<Control-a>", self.Saglama)
        self.ana.bind("<Control-e>", self.DuzenleEkle)
        self.ana.bind("<Control-r>", self.DosyaCikar)
        self.ana.bind("Double-Button-1", self.Pano)
        self.ana.bind("<Escape>", exit)
        
        self.ana.mainloop()
    
    def altDurum(self, deger=0, olan=None):
        self.altdurum = deger
        self.acikolan = olan
    
    def KonTopSec(self, secim):
        if secim == "md5":
            self.KonTip=hashlib.md5
        elif secim == "sha1":
            self.KonTip=hashlib.sha1
        elif secim == "sha224":
            self.KonTip=hashlib.sha224
        elif secim == "sha256":
            self.KonTip=hashlib.sha256
        elif secim == "sha384":
            self.KonTip=hashlib.sha384
        elif secim == "sha512":
            self.KonTip=hashlib.sha512
    
    def DosyaSec(self, event=None):
        global a
        a=askopenfilenames()
        if a == "":
            del a
        else:
            for i in a:
                self.L.insert(END, i)
                self.dosliste.append(i)
            if len(a) == 1:
                self.Durum.config(text="Durum: Dosya listeye eklendi.")
            elif len(a) > 1:
                self.Durum.config(text="Durum: Dosyalar listeye eklendi.")
    
    def DuzenleEkle(self, event=None):
        silinecek=int(self.L.index(ACTIVE))
        if self.E.get() == "":
            try:
                self.E.insert(0, self.dosliste[self.L.index(ACTIVE)])
                self.L.delete(silinecek)
                self.dosliste.pop(silinecek)
            except IndexError:
                self.Durum.config(text="Durum: Liste boş!")
        elif self.E.get() != "":
            self.L.insert(END, self.E.get())
            self.dosliste.append(self.E.get())
            self.E.delete(0,END)
            self.Durum.config(text="Durum: Düzenlendi.")
    
    def DosyaCikar(self, event=None):
        try:
            self.dosliste.pop(int(self.L.index(ACTIVE)))
            self.L.delete(ACTIVE)
        except IndexError:
            self.Durum.config(text="Durum: Liste boş!")
    
    def Pano(self, event=None):
        self.ana.clipboard_clear()
        self.ana.clipboard_get(self.dosliste[self.L.get(ACTIVE)])
        self.ana.withdraw()
        self.Durum.config(text="Durum: Seçim panoya kopyalandı.")
    
    def KontrolEt(self, event=None):
        self.toplam=[]
        try:
            if len(self.dosliste) == 0:
                self.Durum.config(text="Durum: Listeye dosya ekleyin!")
            else:
                for dosya in self.dosliste:
                    try:
                        libkontrolcu.toplamver(self.KonTip, dosya)
                    except MemoryError:
                        gosterim="Geçici belleğe sığmıyor:"+"  "+dosya.split("/")[-1]
                        self.toplam.append(gosterim)
                    else:
                        gosterim=libkontrolcu.toplam+"  "+dosya.split("/")[-1]
                        self.toplam.append(gosterim)
                self.L.delete(0, END)
                for i in self.toplam:
                    self.L.insert(END, str(i))
                self.Durum.config(text="Durum: Kontrol tamamlandı.")
        except NameError:
            self.Durum.config(text="Durum: Kontrol tipini seçin!")
        except AttributeError:
            self.Durum.config(text="Durum: Kontrol tipini seçin!")
    
    def Kaydet(self, event=None):
        kayit=asksaveasfilename()
        if kayit == "" or kayit == ():
            del kayit
        else:
            try:
                kdosya=open(kayit, 'w')
                i=0
                while len(self.toplam)>i:
                    if "Geçici belleğe sığmıyor:" in self.L.get(i):
                        i += 1
                        continue
                    kdosya.write(self.L.get(i)+"\n")
                    i += 1
                kdosya.close()
                self.Durum.config(text="Durum: Dosya kaydedildi.")
            except IOError, (hata_no, hata):
                if hata_no == 13:
                    self.Durum.config(text="Durum: Dosya Kaydedilemedi! Kayıt yerine yazma izniniz olmayabilir!")
    
    def Temizle(self, event=None):
        self.dosliste=[]
        self.E.delete(0, END)
        self.L.delete(0, END)
        try:
            dosya=[]
            libkontrolcu.sondurum=[]
            libkontrolcu.hatadurum=[]
            self.DS.delete(0, END)
            self.KY.delete(0, END)
        except:
            try:
                dosya=[]
                libkontrolcu.sondurum=[]
                libkontrolcu.hatadurum=[]
                self.KDS.delete(0, END)
                self.KDYS.delete(0, END)
            except:
                pass
        self.Durum.config(text="Durum: Temizlendi.")

    def DSdef(self):
        b=askopenfilename()
        if b == "":
            del b
        else:
            self.KDS.delete(0, END)
            self.KDS.insert(0, b)
    
    def DSYdef(self):
        c=askdirectory()
        if c == "":
            del c
        else:
            self.KDYS.delete(0, END)
            self.KDYS.insert(0, c)
    
    def Kdef(self):
        if self.KDS.get() == "":
            self.Durum.config(text="Durum: Dosya seçin ya da internet adresi girin!")
        elif self.KDYS.get() == "":
            self.Durum.config(Text="Durum: Kontrol dizinini seçin!")
        else:
            dosya=[]
            libkontrolcu.hatadurum=[]
            libkontrolcu.sondurum=[]
            dosya.insert(0, self.KDS.get())
            dosya.insert(1, self.KDYS.get())
            try:
                libkontrolcu.check(dosya)
                if len(libkontrolcu.hatadurum) > 0:
                    if 001 in libkontrolcu.hatadurum:
                        Hatanotu = "Adresteki dosya, kontrol toplamı dosyası değil!"
                    elif 002 in libkontrolcu.hatadurum:
                        Hatanotu = "Kontrol toplamı dosyası hatalı!"
                    elif 003 in libkontrolcu.hatadurum:
                        Hatanotu = "%s dosyası bulunamıyor."% libkontrolcu.hatadurum[libkontrolcu.hatadurum.index(003)+1]
                    elif 004 in libkontrolcu.hatadurum:
                        Hatanotu = "%s dosyası geçici belleğe sığmıyor."% libkontrolcu.hatadurum[libkontrolcu.hatadurum.index(004)+1]
                    showerror("Hata", Hatanotu)
                elif len(libkontrolcu.hatadurum) == 0:
                    Durumliste=[]
                    Durumnotu=""
                    n=0
                    while len(libkontrolcu.sondurum) > n:
                        if libkontrolcu.sondurum[n] == True:
                            Durumliste.append(libkontrolcu.sondurum[n+1] + " eskisi ile uyuşuyor")
                        elif libkontrolcu.sondurum[n] == False:
                            Durumliste.append(libkontrolcu.sondurum[n+1] + " değişmiş.")
                        n += 2
                    for i in Durumliste:
                        Durumnotu += i +"\n"
                    showinfo("Sonuç", Durumnotu)
            except IOError, (hata_no, hata):
                if hata_no == 2:
                    showerror("Hata", "%s dosyası bulunamıyor!"% dosya[0])
                if hata_no == "socket error":
                    showerror("Hata","Adres bulunamıyor!")
    
    def KontrolDosyasi(self, event=None):
        if self.altdurum == 0:
            self.FD = Frame(self.ana, relief=RAISED)
            Label(self.FD, text="Dosya Adresi:").grid(row=0, column=0)
            self.KDS=Entry(self.FD, bg="#FFFFFF", width=45);self.KDS.grid(row=0, column=1)
            Label(self.FD, text="Kontrol Dizini:").grid(row=1, column=0)
            self.KDYS=Entry(self.FD, bg="#FFFFFF", width=45);self.KDYS.grid(row=1, column=1)
            KDSB=Button(self.FD, text="Dosya Seç", command=self.DSdef, width=9).grid(row=0, column=2)
            KDYSB=Button(self.FD, text="Dizin Seç", command=self.DSYdef, width=9).grid(row=1, column=2)
            Button(self.FD, text="Kontrol Et", command=self.Kdef).grid(row=2, column=1)
    
            self.ana.maxsize("560", "340")
            self.ana.minsize("560", "340")
            self.FD.pack(side=BOTTOM)
            self.altDurum(1, "D")
            self.Durum.config(text="Durum: Dosyadan kontrol açıldı.")
    
        elif self.altdurum == 1 and self.acikolan == "D":
            self.FD.destroy()
            self.ana.maxsize("560", "250")
            self.ana.minsize("560", "250")
            self.altDurum(0)
            self.Durum.config(text="Durum: Dosyadan kontrol kapatıldı.")
    
        elif self.altdurum == 1 and self.acikolan == "S":
            self.Durum.config(text="Durum: Sağlamayı kapatın!")
    
    def DSSdef(self):
        b=askopenfilename()
        if b == "":
            del b
        else:
            self.DS.delete(0, END)
            self.DS.insert(0, b)
    
    def KSdef(self):
        if self.DS.get() == "":
            self.Durum.config(text="Durum: Dosya seçin!")
        elif self.KY.get() == "":
            self.Durum.config(text="Durum: Kontrol toplamını yazın!")
        else:
            libkontrolcu.hatadurum=[]
            libkontrolcu.sondurum=[]
            try:
                libkontrolcu.ccheck(self.DS.get(), self.KY.get())
                if len(libkontrolcu.hatadurum) > 0:
                    if 011 in libkontrolcu.hatadurum:
                        showerror("Hata", "Kontrol toplamı hatalı!")
                elif len(libkontrolcu.hatadurum) == 0:
                    if libkontrolcu.sondurum[0] == True:
                        Durumnotu = libkontrolcu.sondurum[1] + " eskisi ile uyuşuyor"
                    elif libkontrolcu.sondurum[0] == False:
                        Durumnotu = libkontrolcu.sondurum[1] + " değişmiş."
                    showinfo("Sonuç", Durumnotu)
            except IOError, (hata_no, hata):
                if hata_no == 2:
                    showerror("Hata", "Dosya %s bulunamadı."% DS.get())
            except MemoryError:
                self.Durum.config(text="Durum: Dosya geçici belleğe sığmıyor!")

    def Saglama(self, event=None):
        if self.altdurum == 0:
            self.FC = Frame(self.ana, relief=RAISED)
            Label(self.FC, text="Dosya Adresi:").grid(row=0, column=0)
            self.DS = Entry(self.FC, bg="#FFFFFF", width=43);self.DS.grid(row=0, column=1)
            Label(self.FC, text="Kontrol Toplamı:").grid(row=1, column=0)
            self.KY=Entry(self.FC, bg="#FFFFFF", width=43);self.KY.grid(row=1, column=1)
            DSB=Button(self.FC, text="Dosya Seç", command=self.DSSdef, width=9).grid(row=0, column=2)
            KB=Button(self.FC, text="Kontrol Et", command=self.KSdef, width=9).grid(row=1, column=2)
    
            self.ana.maxsize("560", "310")
            self.ana.minsize("560", "310")
            self.FC.pack(side=BOTTOM)
            self.altDurum(1, "S")
            self.Durum.config(text="Durum: Sağlama açıldı.")
    
        elif self.altdurum == 1 and self.acikolan == "S":
            self.FC.destroy()
            self.ana.maxsize("560", "250")
            self.ana.minsize("560", "250")
            self.altDurum(0)
            self.Durum.config(text="Durum: Sağlama kapatıldı.")
        elif self.altdurum == 1 and self.acikolan == "D":
            self.Durum.config(text="Durum: Dosyadan kontrolü kapatın!")
    
    def yardim(self):
        showinfo("Yardım", 'Kontrolcu hakkında detaylı bilgiyi\n"code.google.com/p/kontrolcu"  adresinden bulabilirsiniz.')
    
    def hakkinda(self):
        showinfo("Hakkında", 'Kontrolcu-Tk 1.5\nKontrolcu için Tkinter arayüzü\n\nGeliştiriciler\n- Taha Doğan Güneş <tdgunes@gmail.com>\n- Osman Karagöz <osmank3@gmail.com>\n\nBelgelendirici\n- Okan Okuroğulları <ookurogullari@gmail.com>\n\nWeb Sitesi: code.google.com/p/kontrolcu\n\nLisans: GPL v3 ile lisanslanmıştır.\nhttp://www.gnu.org/licenses/gpl-3.0.txt')

if __name__ == "__main__":
    #kontk()
    pass